#include "compile_run.hpp"
#include "../comm/httplib.h"

using namespace ns_compile_and_run;
using namespace httplib;

void Usage(std::string proc)
{
    std::cout << "Usage:\n\t" << proc << " port(1024-65536)" << std::endl;
}

int main(int argc, char* argv[])
{
    if(argc != 2)
    {
        Usage(argv[0]);
        return 1;
    }

    Server svr;
    // //      请求路径            函数对象
    // svr.Get("/hello", [](const Request& req, Response& resp){
    //     resp.set_content("hello, libhttp 来咯!", "text/plain;charset=utf8");
    // });

    svr.Post("/compile_and_run", [](const Request& req, Response& resp){
        // 用户请求的正文: in_json
        std::string in_json = req.body;
        std::string out_json;   
        if(!in_json.empty())
        {
            CompileAndRun::Start(in_json, &out_json);
            resp.set_content(out_json, "application/json;charset=utf-8");
        }
    });

    svr.listen("0.0.0.0", std::stoi(argv[1]));    // 启动http服务
    return 0;
}

#if 0
/********************************************************
 * 测试编译+运行模块
 * 编译服务随时可能被多人请求，因此需要保证传递上来的code，
 * 在形成临时源文件时，名称要具备唯一性，否则各用户会互相影响
 ********************************************************/
int main()
{
    // 通过http client 上传一个 json-string
    std::string in_json;
    Json::Value in_value;

    // R"()" --> raw string 原生字符串(即字符串内的特殊字符按照原本含义解读)
    in_value["code"] = R"(#include<iostream>
        int main(){
        // int* p = new int[1024*1024*50];
        // aaaaaaa
        std::cout << "hello world\n";
        return 0;
    })";
    in_value["input"] = "";
    in_value["cpu_limit"] = 1;
    in_value["mem_limit"] = 8;

    Json::FastWriter writer;    
    in_json = writer.write(in_value);
    std::cout << in_value << "\n";

    // 客户端返回的json串
    std::string out_json;
    CompileAndRun::Start(in_json, &out_json);
    std::cout << out_json << "\n";
    return 0;
}
#endif


/* 测试编译、运行 */
#if 0
#include <iostream>

#include "compiler.hpp"
#include "runner.hpp"

using namespace ns_compiler;
using namespace ns_runner;

int main()
{
    std::string code = "code";
    Compiler::Compile(code);
    Runner::Run(code, 1, 64);
    return 0;
}
#endif